home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / Game.EXE_01_2001.iso / demos / Blade of Darkness / data1.cab / Program_Executable_Files / Lib / GameStateAux.py < prev    next >
Encoding:
Python Source  |  2000-11-16  |  13.0 KB  |  575 lines

  1.  
  2.  
  3.  
  4.  
  5. import os
  6. import cPickle
  7. import BBLib
  8. import Bladex
  9. import Reference
  10. ##import ItemTypes
  11. import Breakings
  12. import PickInit
  13. import types
  14. import ObjStore
  15. import cStringIO
  16.  
  17.  
  18.  
  19.  
  20.  
  21. PickDataBase={}
  22. LoadedPickledData={}
  23. aux_dir='.'
  24.  
  25. ## Objetos que hay que ajustar en una segunda pasada
  26. FixDataBase=[]
  27.  
  28.  
  29.  
  30. ##class PersistentObject:
  31. ##  def __init__(self):
  32. ##    self.ObjId=str(id(self)) # Para identificarlo al grabar/guardar
  33. ##
  34. ##  def  __setstate__(self,parm):
  35. ##    self.ObjId=parm[1]
  36. ##    LoadedPickledData[self.ObjId]=self
  37. ##
  38. ##  def persistent_id(self):
  39. ##    return self.ObjId
  40.  
  41. def LoadGlobalCompVars(filename,dest_dict):
  42.  
  43.   file=open(filename)
  44.   u=cPickle.Unpickler(file)
  45.  
  46.   u.persistent_load=persistent_load
  47.   ret=u.load()
  48.   file.close()
  49.  
  50.   # ret es un diccionario con las variables globales de tipo lista, tupla y diccionario.
  51.   for i in ret.keys():
  52.     dest_dict[i]=ret[i]
  53.  
  54.  
  55.  
  56.  
  57. def InitGameState(aux_dir):
  58. ##  Bladex.SetCallCheck(1)
  59. ##  Bladex.OpenDebugChannel("Salida")
  60.  
  61.   global PickDataBase
  62.   PickDataBase={}
  63.  
  64.   filename="%s/PickDataBase.dat"%(aux_dir,)
  65.   funcfile=open(filename,"rt")
  66.   p=cPickle.Unpickler(funcfile)
  67.   PickDataBase=p.load()
  68.   funcfile.close()
  69.   print "PickDataBase read"
  70.  
  71.  
  72. def CleanLoadTemp():
  73.   global PickDataBase
  74.   PickDataBase={}
  75.  
  76.   global LoadedPickledData
  77.   LoadedPickledData={}
  78.  
  79.   global LoadedPickledData
  80.   LoadedPickledData={}
  81.  
  82.  
  83.  
  84. def EndGameState(aux_dir):
  85.  
  86.   filename="%s/PickDataBase.dat"%(aux_dir,)
  87.   funcfile=open(filename,"wt")
  88.   p=cPickle.Pickler(funcfile)
  89.   p.dump(PickDataBase)
  90.   funcfile.close()
  91.   print "PickDataBase written"
  92.  
  93.  
  94.  
  95.  
  96. def persistent_id(obj):
  97.   ret=None
  98.   try:
  99.     ret=obj.persistent_id()
  100.   except AttributeError:
  101.     pass
  102.   except Exception,exc:
  103.     print "GameStateAux.persistent_id()",exc
  104.   return ret
  105.  
  106.  
  107.  
  108. def persistent_load(obj_id):
  109.  
  110.   if ObjStore.ObjectsStore.has_key(obj_id):
  111.     #print "Found at ObjStore",ObjStore.ObjectsStore[obj_id],obj_id
  112.     return ObjStore.ObjectsStore[obj_id]
  113.  
  114. ##  if LoadedPickledData.has_key(filename):
  115. ##    print "GameStateAux.persistent_load Found in LoadedPickledData",obj_id
  116. ##    return LoadedPickledData[obj_id]
  117. ##  else:
  118. ##    filename="%s/%s.dat"%(aux_dir,obj_id)
  119.     filename="%s/%s.dat"%("f",obj_id)
  120.  
  121.     dat=GetPickledData(filename)
  122.  
  123.     try:
  124.       LoadedPickledData[dat.persistent_id()]=dat
  125.     except KeyError:
  126.       LoadedPickledData[obj_id]=dat
  127.     return dat
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. def SavePickData(filename,data):
  137. ##  print "SavePickData, saving",filename,data
  138.   if PickDataBase.has_key(filename):
  139.     return
  140.  
  141.   string_file=cStringIO.StringIO()
  142.   p=cPickle.Pickler(string_file)
  143.   p.persistent_id=persistent_id
  144.   p.dump(data)
  145.   PickDataBase[filename]=string_file.getvalue()
  146.  
  147.  
  148.  
  149.  
  150.  
  151. def GetPickledData(filename):
  152.  
  153.   string_file = cStringIO.StringIO(PickDataBase[filename])
  154.   u=cPickle.Unpickler(string_file)
  155.  
  156.   u.persistent_load=persistent_load
  157.   ret=u.load()
  158.   return ret
  159.  
  160.  
  161. def GetPickledObjects(filename):
  162.   "Loads the ObjStore file"
  163.  
  164.   f=open(filename,'rt')
  165.   u=cPickle.Unpickler(f)
  166.   ret=u.load()
  167.   f.close()
  168.  
  169.   global FixDataBase
  170.   for i in FixDataBase:
  171.     print "Fixing",i
  172.     func_id=i[0]
  173.     ob_id=func_id[0]
  174.     if ObjStore.ObjectsStore.has_key(ob_id):
  175.       cl=ObjStore.ObjectsStore[ob_id]
  176.       print i[1]
  177.       cl_to_assign=None
  178.       if i[4]=="Entity":
  179.         cl_to_assign=Bladex.GetEntity(i[1])
  180.         print "Found Entity",cl_to_assign
  181.       else:
  182.         cl_to_assign=ObjStore.ObjectsStore[i[1]]
  183.         print "Found class",cl_to_assign
  184.  
  185.       if cl_to_assign:
  186.         if i[4]=="Object":
  187.           exec("cl_to_assign."+i[2]+"=cl")
  188.           print "Fixed relationship for object",i
  189.           print "Executed cl_to_assign."+str(i[2])+"=cl"
  190.           print "cl_to_assign:",cl_to_assign
  191.           print "cl:",cl
  192.         else:
  193.           exec("cl_to_assign."+i[2]+"=cl."+func_id[1])
  194.           print "Fixed relationship for function",i
  195.       else:
  196.         print "Can't fix FixDataBase.",ob_id,"Not found.",i
  197.  
  198.  
  199.  
  200.  
  201.  
  202.     else:
  203.       print "Can't fix FixDataBase.",ob_id,"Not found."
  204.  
  205.   FixDataBase=[]
  206.  
  207.  
  208.  
  209. def LoadAutoBODs(dir):
  210.   files=os.listdir(dir)
  211.   for i in files:
  212.     if i[-4:]==".BOD":
  213.       filename="%s/%s"%(dir,i)
  214.       BBLib.ReadAutoBOD(filename)
  215.  
  216.  
  217. def LoadMMPs(files):
  218.   for i in files:
  219.     BBLib.ReadMMP(i)
  220.  
  221.  
  222. def LoadAlphaBMPs(files):
  223.   for i in files:
  224.     Bladex.ReadAlphaBitMap(i[0],i[1])
  225.  
  226.  
  227. def LoadBMPs(files):
  228.   for i in files:
  229.     Bladex.ReadBitMap(i[0],i[1])
  230.  
  231.  
  232. def LoadBODs(files):
  233.   for i in files:
  234.     BBLib.ReadBOD(i)
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242. def AddWeaponToInventory(inv,weapon_name):
  243.  
  244.   object_flag=Reference.GiveObjectFlag(weapon_name)
  245.   if object_flag == Reference.OBJ_BOW:
  246.       inv.AddBow(weapon_name)
  247.   else:
  248.       flag=Reference.GiveWeaponFlag(weapon_name)
  249.       #inv.AddWeapon(i[0],flag)
  250.       inv.AddWeapon(weapon_name,flag)
  251.     
  252.  
  253. def LinkRight(weapon_name,inv,owner):
  254.     weapon = Bladex.GetEntity(weapon_name)
  255.     owner.Unlink(weapon)
  256.     inv.LinkRightHand(weapon_name)
  257.  
  258. def LinkLeft(weapon_name,inv,owner):
  259.     weapon = Bladex.GetEntity(weapon_name)
  260.     owner.Unlink(weapon)
  261.     inv.LinkLeftHand(weapon_name)
  262.  
  263.  
  264. def LinkBack(weapon_name,inv,owner):
  265.     weapon = Bladex.GetEntity(weapon_name)
  266.     owner.Unlink(weapon)
  267.     inv.LinkBack(weapon_name)
  268.  
  269. def LinkLeft2B(weapon_name,inv,owner):
  270.     weapon = Bladex.GetEntity(weapon_name)
  271.     owner.Unlink(weapon)
  272.     inv.LinkLeftHand2(weapon_name)
  273.  
  274. def AddQuiverToInventory(inv,quiver_name):
  275.   obj=Bladex.GetEntity(quiver_name)
  276. ##  ItemTypes.ItemDefaultFuncs(obj)
  277.   inv.AddQuiver(quiver_name)
  278.  
  279.  
  280. def SaveFunctionAux(func):
  281.  
  282.   try:
  283.     func_type=type(func)
  284.     if  func_type == types.MethodType:
  285.       ob_id=func.im_self.persistent_id()
  286.       print "Saving Method:",ob_id,func.im_func.func_name
  287.       return ("m",(ob_id,func.im_func.func_name))
  288.   ##    try:
  289.   ##      id=func.im_class.persistent_id()
  290.   ##      return (id,func.im_func.func_name)
  291.   ##    except:
  292.   ##      print "WARNING, SaveFunctionAux()-> Omiting method",func.im_func.func_name
  293.   ##      return None
  294.  
  295.     elif func_type==types.FunctionType:
  296.       return ("f",(func.func_name,GetFunctionFile(func)))
  297.     elif func_type==types.BuiltinFunctionType:
  298.       if not func.__self__:
  299.         return ("cf",(func.__name__,None))
  300.       else: # Asumo que son entidades
  301.         return ("cf",(func.__name__,func.__self__.Name))
  302.  
  303.     return ("n",(None,None))
  304.  
  305.   except Exception,exc:
  306.     print "Exception in SaveFunctionAux()",exc," with function",func
  307.     return ("n",(None,None))
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314. def LoadFunctionAux(func_id_ex,res_obj=None,res_field=None,aux=None):
  315.  
  316.   assign_func=None
  317.   
  318.   if type(func_id_ex) != types.TupleType:
  319.     print "LoadFunctionAux() ERROR, invalid parameters",type(func_id_ex)
  320.     return
  321.  
  322.   func_id=func_id_ex[1]
  323.  
  324.   func_kind=func_id_ex[0]
  325.   if func_kind=="m": # Metodo
  326.     ob_id=func_id[0]
  327.     if ObjStore.ObjectsStore.has_key(ob_id):
  328.       cl=ObjStore.ObjectsStore[ob_id]
  329.       #res_obj.__dict__[res_field]=eval("cl."+func_id[1])
  330.       assign_func=eval("cl."+func_id[1])
  331.     else:
  332.       if res_obj is not None:
  333.         if type(res_obj) == type(Bladex.GetEntity(0)):
  334.           print "FixDataBase.append() Entity->",func_id,res_obj.Name,res_field,ob_id
  335.           FixDataBase.append((func_id,res_obj.Name,res_field,ob_id,"Entity"))
  336.         else:
  337.           print "FixDataBase.append() class->",func_id,res_obj.ObjId,res_field,ob_id
  338.           FixDataBase.append((func_id,res_obj.ObjId,res_field,ob_id,None))
  339.       else:
  340.         import pdb
  341.         pdb.set_trace()
  342.         print "Can not find object to add to FixDataBase",func_id_ex
  343.   elif func_kind=="f":  # Funcion
  344.     assign_func=(PickInit.ConstFunction(func_id[0],func_id[1]))
  345.   elif func_kind=="cf": # Funcion C
  346.     assign_func=(PickInit.ConstCFunction(func_id[0],func_id[1]))
  347.   elif func_kind=="n":  # None
  348.     assign_func=None
  349.  
  350.   #res_obj.__dict__[res_field]=assign_func
  351.   if res_obj:
  352.     exec("res_obj."+res_field+"=assign_func")
  353.   else:
  354.     return assign_func
  355.  
  356.  
  357. def SaveObjectAux(obj):
  358.   try:
  359.     return ("o",(obj.persistent_id(),None))
  360.   except Exception,exc:
  361.     print "Exception in SaveObjectAux()",exc," with object",obj
  362.     return ("n",(None,None))
  363.  
  364.  
  365.  
  366. def LoadObjectAux(obj_id_ex,res_obj=None,res_field=None,aux=None):
  367. ##  import pdb
  368. ##  pdb.set_trace()
  369.   assign_obj=None
  370.   obj_id=obj_id_ex[1]
  371.   obj_kind=obj_id_ex[0]
  372.   if obj_kind=="o": # Metodo
  373.     ob_id=obj_id[0]
  374.     if ObjStore.ObjectsStore.has_key(ob_id):
  375.       assign_obj=ObjStore.ObjectsStore[ob_id]
  376.     else:
  377.       if res_obj is not None:
  378.         print "FixDataBase.append() Entity->",obj_id,res_field,ob_id
  379.         FixDataBase.append((obj_id,res_obj.ObjId,res_field,ob_id,"Object"))
  380.       else:
  381.         print "Can not find object to add to FixDataBase",obj_id_ex
  382.         import pdb
  383.         pdb.set_trace()
  384.   elif func_kind=="n":  # None
  385.     assign_obj=None
  386.  
  387.   if res_obj:
  388.     exec("res_obj."+res_field+"=assign_obj")
  389.   else:
  390.     return assign_obj
  391.  
  392.  
  393. def SaveEntityAux(ent):
  394.   if ent:
  395.     try:
  396.       return ent.Name
  397.     except:
  398.       print "Error getting entity name",ent
  399.       return None
  400.   return None
  401.  
  402.  
  403. def LoadEntityAux(ent_id):
  404.   if ent_id:
  405.     return Bladex.GetEntity(ent_id)
  406.   return None
  407.  
  408.  
  409. def SaveExtraDataAux(file,aux_dir):
  410.     try:
  411.       import ExtraData
  412.  
  413.       filename="%s/ExtraData.dat"%(aux_dir,)
  414.       if ExtraData.SaveExtraData(filename):
  415.           file.write('try:\n')
  416.           file.write('  GameStateAux.LoadExtraDataAux("%s")\n'%(filename,))
  417.           file.write('except:\n')
  418.           file.write('  print "Can not load ExtraData"\n\n')
  419.     except:
  420.       pass
  421.  
  422.  
  423. def LoadExtraDataAux(filename):
  424.     import ExtraData
  425.  
  426.     ExtraData.LoadExtraData(filename)
  427.  
  428. def GetAllBases(check_class):
  429.   ret=[]
  430.   bases=check_class.__bases__
  431.   for i in bases:
  432.     ret.append(i)
  433.     bases_i=GetAllBases(i)
  434.     for j in bases_i:
  435.       ret.append(j)
  436.  
  437.   return ret
  438.  
  439.  
  440.  
  441.  
  442. def GetNewMembers(check_class):
  443.   "Obtiene los miembros nuevos de la clase y de sus clases base"
  444.  
  445.   class_dict={}
  446. ##  bases=check_class.__class__.__bases__
  447.   bases=GetAllBases(check_class.__class__)
  448.   for i in bases:
  449.     class_dict.update(i.__dict__)
  450.  
  451.   class_dict.update(check_class.__class__.__dict__)
  452.   check_dict=check_class.__dict__
  453.   new_members={}
  454.   for j in check_dict.keys():
  455.     if not class_dict.has_key(j):
  456.       new_members[j]=check_dict[j]
  457.  
  458.   return new_members
  459.  
  460.  
  461.  
  462. def SaveNewMembers(check_class):
  463.   if type(check_class)!=types.InstanceType:
  464.     return ()
  465.  
  466.   ret=[]
  467.   entity_type=type(Bladex.GetEntity(0))
  468.   members=GetNewMembers(check_class)
  469.   members_keys=members.keys()
  470.   for i in members_keys:
  471.     member=members[i]
  472.     member_t=type(member)
  473.     print check_class,i,member_t
  474.     if member_t==types.FunctionType or member_t==types.MethodType:
  475.       ret.append(("Function",i,SaveFunctionAux(member)))
  476.     elif member_t==entity_type:
  477.       ret.append(("Entity",i,SaveEntityAux(member)))
  478.     else:
  479.       ret.append(("Other",i,member))
  480.  
  481. ##  altered_methods=GetAlteredMethods(check_class)
  482. ##  altered_methods_keys=altered_methods.keys()
  483. ##  for i in altered_methods_keys:
  484. ##    member=altered_methods[i]
  485. ##    ret.append(("Function",i,SaveFunctionAux(member)))
  486.  
  487.   return tuple(ret)
  488.  
  489.  
  490. def LoadNewMembers(mod_class,new_members):
  491.  
  492.   try:
  493.     for i in new_members:
  494.       if i[0]=="Function":
  495.         LoadFunctionAux(i[2],mod_class,i[1])
  496.       elif i[1]=="Entity":
  497.         mod_class.__dict__[i[1]]=LoadEntityAux(i[2])
  498.       else:
  499.         mod_class.__dict__[i[1]]=i[2]
  500.   except Exception,exc:
  501.     print "LoadNewMembers() Error",exc,mod_class,new_members
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512. def GetBaseMethod(check_class,method_name,bases):
  513.  
  514.   for i in bases:
  515.     try:
  516.       tmp_string="i.__dict__['"+method_name+"']"
  517.       return eval(tmp_string)
  518.     except:
  519.       pass
  520.  
  521.   return None
  522.  
  523.  
  524. def GetAlteredMethods(check_class):
  525.   "Obtiene los metodos de una clase y de sus clases base que han sido cambiados"
  526.  
  527.   class_dict={}
  528.   bases=GetAllBases(check_class.__class__)
  529.   for i in bases:
  530.     class_dict.update(i.__dict__)
  531.  
  532.   class_dict.update(check_class.__class__.__dict__)
  533.  
  534.   altered_beast={}
  535.   for j in class_dict.keys():
  536.     member=eval("check_class."+j)
  537.  
  538.     if type(member)==types.MethodType:
  539.       found_func=eval("member.im_func")
  540.       tmp_string="check_class.__class__.__dict__['"+j+"']"
  541.       try:
  542.         reference_func=eval(tmp_string)
  543.       except:
  544.         reference_func=GetBaseMethod(check_class,j,bases)
  545.  
  546.       if found_func!=reference_func:
  547.         altered_beast[j]=member
  548.  
  549.  
  550.   return altered_beast
  551.  
  552.  
  553.  
  554. def GetFunctionFile(f):
  555.   if not f:
  556.     return "Error, None is not  a function"
  557.   try:
  558.     # No se si esto depende de W2000
  559.     import string
  560.     s=str(f.func_code)
  561.     s2=string.split(s,'"') # Siempre?
  562.     func_path=s2[1]  # Siempre?
  563.  
  564.     import os
  565.     filename=os.path.split(func_path)[1]
  566.     filename_noext=os.path.splitext(filename)[0]
  567.  
  568.     return filename_noext
  569.   except e:
  570.     print "Exception in GetFunctionFile",e
  571.     return "Error getting lib"
  572.  
  573.  
  574.  
  575.